/**axios封装
 * 请求拦截、相应拦截、错误统一处理
 */
import axios from 'axios';
import QS from 'qs';
import toast  from '@/components/Toast/index';
import store from '@/store/store'
const origin = location.hostname  //获取访问的IP地址
//console.log(origin)
// 环境的切换(开发环境、测试环境、生产环境)
if (process.env.NODE_ENV == 'development') { 
  // axios.defaults.baseURL = 'http://39.99.138.78:86/';
  axios.defaults.baseURL = 'http://218.18.105.199:8080/api';
  // axios.defaults.baseURL = 'http://39.99.138.78:86';
  // axios.defaults.baseURL = '100.100.100.32:8080';
} else if (process.env.NODE_ENV == 'debug') { 
 axios.defaults.baseURL = '';
} else if (process.env.NODE_ENV == 'production') { 
  //axios.defaults.baseURL = 'http://' + origin+':8080/api';
  //axios.defaults.baseURL = 'http://218.18.105.199:8080/api';  
  //  axios.defaults.baseURL = '/api'  //关键代码
  axios.defaults.baseURL = 'http://218.18.105.199:8080/api'
  // axios.defaults.baseURL = 'http://39.99.138.78:86';
  // axios.defaults.baseURL = '100.100.100.32:8080';
}
let cancel, promiseArr = {}
// "请求" 拦截器,过滤重复的请求
axios.interceptors.request.use(config => {
  //发起请求时，取消掉当前正在进行的相同请求
  if (promiseArr[config.url]) {
    promiseArr[config.url]('操作取消')
    promiseArr[config.url] = cancel
  } else {
    promiseArr[config.url] = cancel
  }
  return config
}, error => {
  return Promise.reject(error)
  })


 // 响应时间
axios.defaults.timeout = 120000;
 
// post请求头
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
 
// 请求拦截器
axios.interceptors.request.use( 
 config => {
  // 每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每 次请求都手动添加了
  // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
  const token = store.state.token;  
  token && (config.headers.Authorization = token);  
  return config; 
 }, 
 error => {  
  return Promise.error(error); 
 })
 
// 响应拦截器
axios.interceptors.response.use( 
 response => {  
  if (response.status === 200) {   
   return Promise.resolve(response);  
  } else {   
   return Promise.reject(response);  
  } 
 },
 // 服务器状态码不是200的情况 
 error => {  
  if (error.response.status) {   
   switch (error.response.status) {    
    // 401: 未登录    
    // 未登录则跳转登录页面，并携带当前页面的路径    
    // 在登录成功后返回当前页面，这一步需要在登录页操作。    
    case 401:     
     router.replace({      
      path: '/',      
      query: { redirect: router.currentRoute.fullPath } 
     });
     break;
    // 403 token过期    
    // 登录过期对用户进行提示    
    // 清除本地token和清空vuex中token对象    
    // 跳转登录页面    
    case 403:
    toast.center('登录过期，请重新登录')      
     // 清除token     
     localStorage.removeItem('token');     
     store.commit('loginSuccess', null);     
     // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
     setTimeout(() => {      
      router.replace({       
       path: '/',       
       query: { 
        redirect: router.currentRoute.fullPath 
       }      
      });     
     }, 1000);     
     break; 
    // 404请求不存在    
    case 404:     
     toast.center('网络请求不存在') ;    
    break;    
    // 其他错误，直接抛出错误提示    
    default: 
    toast.center(error.response.data.message) ;       
   }   
   return Promise.reject(error.response);  
  }  
 }
);
/** 
 * get方法，对应get请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
export function get(url, params){ 
 return new Promise((resolve, reject) =>{  
  axios.get(url, {   
   params: params  
  })  
    .then(res => {
   resolve(res.data);  
  })  
    .catch(err => {  
   reject(err.data)  
  }) 
 });
}

/** 
 * post方法，对应post请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
export function post(url, params) { 
 return new Promise((resolve, reject) => {   
  axios.post(url, QS.stringify(params))  
  .then(res => {   
   resolve(res.data);  
  })  
  .catch(err => {   
   reject(err.data)  
  }) 
 });
}
